package lq506;


import java.util.Scanner;

/*
 lq506,AC
 输入数据：
6 2 4 6
5 3 4 6 4 9
1 2
1 2 3
1 3 4
2 3 5
4 5 6

 * */
//保存种子杂交方案
class Case{
	//该方案的成熟时间
	//方案中两个种子，取长的成熟时间
	public int maxe;
	//方案中所需两个种子的编号
	public int f1;
	public int f2;
	//下一个方案，null表示不存在下一个
	public Case next = null;
	
	public String toString() {
		return "Case [maxe=" + maxe + ", f1=" + f1 + ", f2=" + f2 + ", next=" + next + "]";
	}
}
public class Main {

	static int N,M,K,T;
	//每个种子的杂交方案可能有多种
	//LinkedList数组，保存每个种子的杂交方案，下标为种子编号从1开始
	static Case[] c;
	//保存全部种子获取的最短天数数组，下标为种子编号从1开始，初始已有为0，默认-1
	static int[] t;
	//保存每个种子的生长时间，下标为种子编号从1开始
	static int[] e;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		M = sc.nextInt();
		K = sc.nextInt();
		T = sc.nextInt();
		e = new int[N+1];
		t = new int[N+1];
		c = new Case[N+1];
		
		for(int i=1;i<=N;i++) {
			//初始化每个种子
			e[i] = sc.nextInt();
			//每个种子最短的获取天数初始置为-1
			t[i] = -1;
		}
		for(int i=1;i<=M;i++) {
			//已有的种子初始获得天数为0
			t[sc.nextInt()] = 0;
			
		}
		for(int i=1;i<=K;i++) {
			//邻接表保存每个种子的杂交方案和方案的成熟时间
			int f1 = sc.nextInt();
			int f2 = sc.nextInt();
			int to = sc.nextInt();
			Case temp = new Case();
			temp.f1 = f1;
			temp.f2 = f2;
			//方案成熟时间：两个种子取长的成熟时间
			temp.maxe = Math.max(e[f1], e[f2]);
			//放入方案的邻接表
			temp.next = c[to];
			c[to] = temp;
		}
		
		//输出e，t，data
		/*for(int i=1;i<=N;i++) {
			System.out.print(e[i] + ",");
		}
		System.out.println();
		for(int i=1;i<=N;i++) {
			System.out.print(t[i] + ",");
		}
		System.out.println();
		for(int i=1;i<=N;i++) {
			System.out.println(c[i]);
		}*/	
		
		
		System.out.println(dfs(T));
	}
	
	
	//dfs找方案的解，所有方案里面取最终时间最短的
	//返回最短时间，更新t数组
	//输入参数是节点编号
	static int dfs(int v) {
		//如果当前节点的t已知，则直接返回
		if(t[v]!=-1)
			return t[v];
		
		//遍历当前种子全部的杂交方案
		int mint=Integer.MAX_VALUE;
		Case temp=c[v];
		while(temp!=null) {
			//当前方的t
			//成熟时间maxe加上两个种子的t取值大的
			int ct = temp.maxe + Math.max(dfs(temp.f1), dfs(temp.f2));
			mint = Math.min(mint, ct);
			
			//计算下个方案
			temp = temp.next;
		}
		
		//设置当前节点的t
		t[v] = mint;
		
		//返回当前节点的t
		return mint;
	}
}

